package com.wfg.controller;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

/**
 * @author: 王富贵
 * @description:
 * @createTime: 2022年12月04日 22:34:53
 */
@Slf4j
@RestController
public class LogInfController {

    @PostMapping("/log")
    public void log(@RequestBody JSONObject request) {
        // 日志开头输出入参
        log.info("log() called with params => [request = {}]", request);

        // 对重要的分支条件进行日志输出进入了哪个分支
        Boolean isVip = Boolean.TRUE;
        if (isVip) {
            log.info("vip biz");
        } else {
            log.info("not vip biz");
        }

        // 重要的远程调用日志打印入参和结果
        log.info("callRemote() called with params => [request = {}]", request);
        JSONObject result = callRemote(request); // 执行远程调用
        log.info("log() returned => [{}]", request);

        // 异常捕获中使用错误日志替换堆栈信息打印收集
        try {
            getOrder(); // 模拟尝试获取订单
        } catch (Exception e) {
            // e.printStackTrace(); 前往不要打印错误堆栈了，不然leader捶你
            log.error("get order error");
            // throw new RuntimeException(e); 我们可以抛个异常去捕获，给用户一个提示信息
        }

        // 日志结尾输出响应内容
        log.info("log() returned => [{}]", request);
    }

    /**
     * 模拟远程调用方法
     */
    private JSONObject callRemote(JSONObject request) {
        System.out.println("我是远程调用");
        return request;
    }

    /**
     * 模拟一个可能出现异常的调用
     */
    private void getOrder() {
        if (new Random().nextBoolean()) {
            throw new RuntimeException("随处给你整个错");
        }
    }
}
